﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RzCorportativo.Lib
{
    public class Feedback
    {
        public long VagaId { get; set; }

        public long UsuarioIndicadoId { get; set; }

        public string Comentario { get; set; }

        public long UsuarioPostId { get; set; }

        public DateTime DataPostagem { get; set; }

        public bool IsNew { get { return this.DataPostagem == DateTime.MinValue; } }

        public bool Salvar()
        {
            bool result = false;
            DataAccess.Transaction.Begin(context =>
            {
                DataAccess.Feedback feedback = null;
                if (this.IsNew)
                    feedback = this.Insert(context);
                else
                    feedback = this.Update(context);
                return result = true;
            }).OnError(ex =>
            {
                throw ex;
            }).OnSuccess(() =>
            {
                result = true;
            });
            return result;
        }

        private DataAccess.Feedback Update(DataAccess.SistemaCurricularEntities context)
        {
            return this.CreateModel(context);
        }

        private DataAccess.Feedback Insert(DataAccess.SistemaCurricularEntities context)
        {
            var model = this.CreateModel(context);
            context.AddToFeedback(model);
            return model;
        }

        private DataAccess.Feedback CreateModel(DataAccess.SistemaCurricularEntities context, bool forceIsNew = false)
        {
            DataAccess.Feedback feedback = null;
            if (this.IsNew || forceIsNew)
            {
                feedback = new DataAccess.Feedback();
                this.DataPostagem = DateTime.Now.Date;
            }
            else
            {
                feedback = context.Feedback.FirstOrDefault(f => f.VagaId == this.VagaId && this.UsuarioIndicadoId == f.UsuarioIndicadoId && this.DataPostagem == f.DataPostagem);
                if (feedback == null)
                    throw new Exception("Dados de feedback inválido");
            }
            feedback.DataPostagem = this.DataPostagem;
            feedback.VagaId = this.VagaId;
            feedback.UsuarioIndicadoId = this.UsuarioIndicadoId;
            feedback.UsarioPostId = this.UsuarioPostId;
            feedback.Comentario = this.Comentario;

            return feedback;
        }
    }
}
